GtkFileChooserDialog: Define children with a GtkBuilder template
authorTristan Van Berkom <tristanvb@openismus.com>
Mon, 25 Mar 2013 12:49:49 +0000 (21:49 +0900)
committerTristan Van Berkom <tristanvb@openismus.com>
Mon, 8 Apr 2013 12:19:28 +0000 (21:19 +0900)
gtk/Makefile.am
gtk/gtk.gresource.xml
gtk/gtkfilechooserdialog.c
gtk/gtkfilechooserdialog.ui [new file with mode: 0644]
gtk/gtkfilechooserprivate.h
gtk/tests/templates.c

index 5d163d01a99e2c319597b0a8a72fbbd9b000ee0c..bb115360400f9142e0a878d8d6ee316bcdd521a8 100644 (file)
@@ -1103,6 +1103,7 @@ COMPOSITE_TEMPLATES =                     \
        gtkcolorchooserdialog.ui        \
        gtkdialog.ui                    \
        gtkfilechooserdefault.ui        \
+       gtkfilechooserdialog.ui         \
        gtkinfobar.ui                   \
        gtklockbutton.ui                \
        gtkmessagedialog.ui             \
index baa57a5d2ddeb799be0f14320cf806f4d06a53f0..87797919e138ed35db0b4b7e2b2024452beca334 100644 (file)
@@ -18,6 +18,7 @@
     <file compressed="true">gtkcolorchooserdialog.ui</file>
     <file compressed="true">gtkdialog.ui</file>
     <file compressed="true">gtkfilechooserdefault.ui</file>
+    <file compressed="true">gtkfilechooserdialog.ui</file>
     <file compressed="true">gtkinfobar.ui</file>
     <file compressed="true">gtklockbutton.ui</file>
     <file compressed="true">gtkmessagedialog.ui</file>
index 6ed41b68f31928d982878e43b9cc3438f878890d..6d32a98ba4a93a10f6448f90a3e1c213b0911324 100644 (file)
 
 #define GTK_FILE_CHOOSER_DIALOG_GET_PRIVATE(o)  (GTK_FILE_CHOOSER_DIALOG (o)->priv)
 
-static void gtk_file_chooser_dialog_finalize   (GObject                   *object);
-
-static GObject* gtk_file_chooser_dialog_constructor  (GType                  type,
-                                                     guint                  n_construct_properties,
-                                                     GObjectConstructParam *construct_params);
 static void     gtk_file_chooser_dialog_set_property (GObject               *object,
                                                      guint                  prop_id,
                                                      const GValue          *value,
@@ -211,6 +206,12 @@ static void     gtk_file_chooser_dialog_get_property (GObject               *obj
 
 static void     gtk_file_chooser_dialog_map          (GtkWidget             *widget);
 static void     gtk_file_chooser_dialog_unmap        (GtkWidget             *widget);
+static void     file_chooser_widget_file_activated   (GtkFileChooser        *chooser,
+                                                     GtkFileChooserDialog  *dialog);
+static void     file_chooser_widget_default_size_changed (GtkWidget            *widget,
+                                                         GtkFileChooserDialog *dialog);
+static void     file_chooser_widget_response_requested (GtkWidget            *widget,
+                                                       GtkFileChooserDialog *dialog);
 
 static void response_cb (GtkDialog *dialog,
                         gint       response_id);
@@ -225,10 +226,8 @@ gtk_file_chooser_dialog_class_init (GtkFileChooserDialogClass *class)
   GObjectClass *gobject_class = G_OBJECT_CLASS (class);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
 
-  gobject_class->constructor = gtk_file_chooser_dialog_constructor;
   gobject_class->set_property = gtk_file_chooser_dialog_set_property;
   gobject_class->get_property = gtk_file_chooser_dialog_get_property;
-  gobject_class->finalize = gtk_file_chooser_dialog_finalize;
 
   widget_class->map       = gtk_file_chooser_dialog_map;
   widget_class->unmap     = gtk_file_chooser_dialog_unmap;
@@ -237,47 +236,33 @@ gtk_file_chooser_dialog_class_init (GtkFileChooserDialogClass *class)
 
   _gtk_file_chooser_install_properties (gobject_class);
 
+  /* Bind class to template
+   */
+  gtk_widget_class_set_template_from_resource (widget_class,
+                                              "/org/gtk/libgtk/gtkfilechooserdialog.ui");
+
+  gtk_widget_class_bind_child (widget_class, GtkFileChooserDialogPrivate, widget);
+  gtk_widget_class_bind_callback (widget_class, response_cb);
+  gtk_widget_class_bind_callback (widget_class, file_chooser_widget_file_activated);
+  gtk_widget_class_bind_callback (widget_class, file_chooser_widget_default_size_changed);
+  gtk_widget_class_bind_callback (widget_class, file_chooser_widget_response_requested);
+
   g_type_class_add_private (class, sizeof (GtkFileChooserDialogPrivate));
 }
 
 static void
 gtk_file_chooser_dialog_init (GtkFileChooserDialog *dialog)
 {
-  GtkWidget *action_area, *content_area;
   GtkFileChooserDialogPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (dialog,
                                                                   GTK_TYPE_FILE_CHOOSER_DIALOG,
                                                                   GtkFileChooserDialogPrivate);
-  GtkDialog *fc_dialog = GTK_DIALOG (dialog);
-
   dialog->priv = priv;
   dialog->priv->response_requested = FALSE;
 
-  content_area = gtk_dialog_get_content_area (fc_dialog);
-  action_area = gtk_dialog_get_action_area (fc_dialog);
-
-  gtk_container_set_border_width (GTK_CONTAINER (fc_dialog), 5);
-  gtk_box_set_spacing (GTK_BOX (content_area), 2); /* 2 * 5 + 2 = 12 */
-  gtk_container_set_border_width (GTK_CONTAINER (action_area), 5);
-
-  gtk_window_set_role (GTK_WINDOW (dialog), "GtkFileChooserDialog");
+  gtk_widget_init_template (GTK_WIDGET (dialog));
 
-  /* We do a signal connection here rather than overriding the method in
-   * class_init because GtkDialog::response is a RUN_LAST signal.  We want *our*
-   * handler to be run *first*, regardless of whether the user installs response
-   * handlers of his own.
-   */
-  g_signal_connect (dialog, "response",
-                   G_CALLBACK (response_cb), NULL);
-}
-
-static void
-gtk_file_chooser_dialog_finalize (GObject *object)
-{
-  GtkFileChooserDialog *dialog = GTK_FILE_CHOOSER_DIALOG (object);
-
-  g_free (dialog->priv->file_system);
-
-  G_OBJECT_CLASS (gtk_file_chooser_dialog_parent_class)->finalize (object);  
+  _gtk_file_chooser_set_delegate (GTK_FILE_CHOOSER (dialog),
+                                 GTK_FILE_CHOOSER (priv->widget));
 }
 
 static gboolean
@@ -429,50 +414,6 @@ file_chooser_widget_response_requested (GtkWidget            *widget,
 
   g_list_free (children);
 }
-  
-static GObject*
-gtk_file_chooser_dialog_constructor (GType                  type,
-                                    guint                  n_construct_properties,
-                                    GObjectConstructParam *construct_params)
-{
-  GtkFileChooserDialogPrivate *priv;
-  GtkWidget *content_area;
-  GObject *object;
-
-  object = G_OBJECT_CLASS (gtk_file_chooser_dialog_parent_class)->constructor (type,
-                                                                              n_construct_properties,
-                                                                              construct_params);
-  priv = GTK_FILE_CHOOSER_DIALOG_GET_PRIVATE (object);
-
-  gtk_widget_push_composite_child ();
-
-  if (priv->file_system)
-    priv->widget = g_object_new (GTK_TYPE_FILE_CHOOSER_WIDGET,
-                                NULL);
-  else
-    priv->widget = g_object_new (GTK_TYPE_FILE_CHOOSER_WIDGET, NULL);
-
-  g_signal_connect (priv->widget, "file-activated",
-                   G_CALLBACK (file_chooser_widget_file_activated), object);
-  g_signal_connect (priv->widget, "default-size-changed",
-                   G_CALLBACK (file_chooser_widget_default_size_changed), object);
-  g_signal_connect (priv->widget, "response-requested",
-                   G_CALLBACK (file_chooser_widget_response_requested), object);
-
-  content_area = gtk_dialog_get_content_area (GTK_DIALOG (object));
-
-  gtk_container_set_border_width (GTK_CONTAINER (priv->widget), 5);
-  gtk_box_pack_start (GTK_BOX (content_area), priv->widget, TRUE, TRUE, 0);
-
-  gtk_widget_show (priv->widget);
-
-  _gtk_file_chooser_set_delegate (GTK_FILE_CHOOSER (object),
-                                 GTK_FILE_CHOOSER (priv->widget));
-
-  gtk_widget_pop_composite_child ();
-
-  return object;
-}
 
 static void
 gtk_file_chooser_dialog_set_property (GObject         *object,
@@ -568,7 +509,11 @@ gtk_file_chooser_dialog_unmap (GtkWidget *widget)
   GTK_WIDGET_CLASS (gtk_file_chooser_dialog_parent_class)->unmap (widget);
 }
 
-/* GtkDialog::response handler */
+/* We do a signal connection here rather than overriding the method in
+ * class_init because GtkDialog::response is a RUN_LAST signal.  We want *our*
+ * handler to be run *first*, regardless of whether the user installs response
+ * handlers of his own.
+ */
 static void
 response_cb (GtkDialog *dialog,
             gint       response_id)
diff --git a/gtk/gtkfilechooserdialog.ui b/gtk/gtkfilechooserdialog.ui
new file mode 100644 (file)
index 0000000..67d47b6
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.10 -->
+  <template class="GtkFileChooserDialog" parent="GtkDialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">5</property>
+    <property name="role">GtkFileChooserDialog</property>
+    <property name="type_hint">dialog</property>
+    <signal name="response" handler="response_cb" swapped="no"/>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox1">
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area1">
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFileChooserWidget" id="widget">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="border_width">5</property>
+            <property name="orientation">vertical</property>
+            <signal name="default-size-changed" handler="file_chooser_widget_default_size_changed" swapped="no"/>
+            <signal name="file-activated" handler="file_chooser_widget_file_activated" swapped="no"/>
+            <signal name="response-requested" handler="file_chooser_widget_response_requested" swapped="no"/>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>
index 3f7d08ce57942ff7b16026aed3d3ff9f6cea58c5..34ff0f0f66c2912be7ec0e91e94b3b43586c869c 100644 (file)
@@ -106,8 +106,6 @@ GSList *       _gtk_file_chooser_list_shortcut_folder_files (GtkFileChooser *cho
 struct _GtkFileChooserDialogPrivate
 {
   GtkWidget *widget;
-  
-  char *file_system;
 
   /* for use with GtkFileChooserEmbed */
   gboolean response_requested;
index b9c7fd992ac0817963f4ad07a6d8261e6ac15c78..56704d269b2986b56b706057ec0da4212ad5fb0d 100644 (file)
@@ -205,6 +205,25 @@ test_file_chooser_widget_basic (void)
   gtk_widget_destroy (widget);
 }
 
+static void
+test_file_chooser_dialog_basic (void)
+{
+  GtkWidget *widget;
+
+  g_test_log_set_fatal_handler (ignore_gvfs_warning, NULL);
+
+  widget = gtk_file_chooser_dialog_new ("The Dialog", NULL,
+                                       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+                                       GTK_STOCK_OK, GTK_RESPONSE_OK,
+                                       NULL);
+
+  g_assert (GTK_IS_FILE_CHOOSER_DIALOG (widget));
+  g_timeout_add (100, main_loop_quit_cb, NULL);
+  gtk_main();
+
+  gtk_widget_destroy (widget);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -230,6 +249,7 @@ main (int argc, char **argv)
   g_test_add_func ("/Template/GtkAppChooserDialog/Basic", test_app_chooser_dialog_basic);
   g_test_add_func ("/Template/GtkColorChooserDialog/Basic", test_color_chooser_dialog_basic);
   g_test_add_func ("/Template/GtkFileChooserWidget/Basic", test_file_chooser_widget_basic);
+  g_test_add_func ("/Template/GtkFileChooserDialog/Basic", test_file_chooser_dialog_basic);
 
   return g_test_run();
 }